home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok49.lha
/
Speech
/
txt
/
Speech.mod
next >
Wrap
Text File
|
1993-08-15
|
6KB
|
195 lines
(*----------------------------------------------------------------------------
:Program. Speech.mod
:Author. Franz Dimbeck
:Address. Troppauerstr. 48
:Adress. 8058 Erding
:Phone. 08122 18135
:Copyright. Freeware
:Language. Oberon
:Translator. Oberon V1.17.1 A+L AG Fridtjof Siebert
:Contents. Routinen zur Sprachunterstützung mit Ausgabe der Mundform.
:Support. Speech Modula-2 [mif]
:History. V1.0 Mai 1990 mit Mundausgabe Modula-2 Franz Dimbeck
:History. V1.1 23-Nov-1990 Oberon Franz Dimbeck
:Remark. Wer übersetzt die TGerman-Prozedur des Moduls Speech (M2)
:Remark. von Michael Frieß [mif] nach OBERON ?
-----------------------------------------------------------------------------*)
MODULE Speech;
IMPORT
Sys: SYSTEM,
D : Dos,
E : Exec,
ES : ExecSupport,
N : Narrator,
Str: Strings,
R : Requests,
Translator,
NoGuruRq;
TYPE
voice* = RECORD
rate*, pitch*, mode*,
sex*, volume*, sampFreq*,
channels*: INTEGER;
(*
:note. rate Range: 40..400 default: 150
:note. pitch Range: 65..320 default: 110
:note. mode Range: 0=natural, 1=robotic default: 0
:note. sex Range: 0=male, 1=feamle default: 0
:note. volume Range: 0..64 default: 64
:note. sampFreq Range: 5000..28000 default: 22200
:note. channels Range: 0=both, 1=left, 2=right default: 0
*)
END;
VAR DefaultVoice* : voice;
MouthProc* : PROCEDURE(Width,Height:INTEGER);
(* :note. MouthProc is a procedure supplied by you, wich does something
:note. with the mouthinformations Width:INTEGER and Height:INTEGER,
:note. e.g. draws different mouthshapes.
:note. When SayPhonemes is started, MouthProc executes repeatedly
:note. until Narrator stops speaking.
*)
CONST module = "Speech";
readP = "ReadMouth";
VAR WritePort,
ReadPort : E.MsgPortPtr;
WriteNarrator : N.NarratorPtr;
ReadNarrator : N.MouthPtr;
BothChannels : ARRAY 4 OF BYTE;
RightChannels : ARRAY 2 OF BYTE;
LeftChannels : ARRAY 2 OF BYTE;
PROCEDURE OpenNarrator ;
BEGIN
WritePort := NIL; WriteNarrator := NIL;
WritePort := ES.CreatePort (Sys.ADR(module), 0);
R.Assert((WritePort # NIL),"WritePort klemmt");
WriteNarrator := ES.CreateExtIO (WritePort, Sys.SIZE (N.Narrator));
R.Assert((WriteNarrator # NIL),"WriteNarrator klemmt");
WriteNarrator.message.command := E.write;
WriteNarrator.chMasks := Sys.ADR(BothChannels);
WriteNarrator.nmMasks := 4;
IF E.OpenDevice (N.narratorName, 0, WriteNarrator, LONGSET{0})#0 THEN END;
WriteNarrator^.mouths := 1;
ReadPort := NIL; ReadNarrator := NIL;
ReadPort := ES.CreatePort (NIL, 0);
R.Assert((ReadPort # NIL),"ReadPort klemmt");
ReadNarrator := ES.CreateExtIO (ReadPort, Sys.SIZE (N.Mouth));
R.Assert((ReadNarrator # NIL),"ReadNarrator klemmt");
ReadNarrator.voice := WriteNarrator^;
ReadNarrator.voice.message.error := 0;
ReadNarrator.voice.message.command := E.read;
ReadNarrator.voice.message.message.replyPort := ReadPort;
ReadNarrator.voice.message.message.length := Sys.SIZE(N.Mouth);
ReadNarrator.width := 0;
ReadNarrator.height := 0;
END OpenNarrator;
PROCEDURE CloseNarrator;
BEGIN
IF (ReadNarrator # NIL) THEN ES.DeleteExtIO (ReadNarrator) END;
IF (ReadPort # NIL) THEN ES.DeletePort (ReadPort) END;
IF (WriteNarrator # NIL) THEN
E.CloseDevice (WriteNarrator);
ES.DeleteExtIO (WriteNarrator)
END;
IF (WritePort # NIL) THEN ES.DeletePort (WritePort) END;
END CloseNarrator;
PROCEDURE SayPhonemes* (p: ARRAY OF CHAR; v: voice);
VAR i : INTEGER;
BEGIN
WriteNarrator.rate := v.rate;
WriteNarrator.pitch := v.pitch;
WriteNarrator.mode := v.mode;
WriteNarrator.sex := v.sex;
WriteNarrator.volume := v.volume;
WriteNarrator.sampFreq := v.sampFreq;
IF (v.channels=1) THEN
WriteNarrator.chMasks := Sys.ADR(LeftChannels);
WriteNarrator.nmMasks := 2;
ELSIF (v.channels=2) THEN
WriteNarrator.chMasks := Sys.ADR(RightChannels);
WriteNarrator.nmMasks := 2;
ELSE
WriteNarrator.chMasks := Sys.ADR(BothChannels);
WriteNarrator.nmMasks := 4;
END;
WriteNarrator.message.data := Sys.ADR(p);
WriteNarrator.message.length := Str.Length (p);
IF (MouthProc#NIL) THEN
WriteNarrator^.mouths := 1;
E.SendIO(WriteNarrator);
E.DoIO(ReadNarrator);
i:=1;
REPEAT
INC(i);
REPEAT
MouthProc(Sys.VAL(SHORTINT,ReadNarrator^.width),
Sys.VAL(SHORTINT,ReadNarrator^.height));
E.DoIO(ReadNarrator);
UNTIL (ReadNarrator^.voice.message.error = N.noWrite);
UNTIL i>10;
E.WaitIO(WriteNarrator);
ELSE
E.DoIO(WriteNarrator);
END;
END SayPhonemes;
PROCEDURE Translate* (in: ARRAY OF CHAR; VAR out: ARRAY OF CHAR) : LONGINT;
BEGIN
RETURN Translator.Translate
(Sys.ADR(in), Str.Length(in), Sys.ADR(out), LEN(out)-1);
END Translate;
PROCEDURE Say* (EnglishString: ARRAY OF CHAR);
VAR
Phonemes : ARRAY 1024 OF CHAR;
Result : LONGINT;
BEGIN
Result := Translate(EnglishString,Phonemes);
SayPhonemes(Phonemes, DefaultVoice);
END Say;
BEGIN
MouthProc := NIL;
OpenNarrator;
BothChannels[0] := 3;
BothChannels[1] := 5;
BothChannels[2] := 10;
BothChannels[3] := 12;
LeftChannels[0] := 1;
LeftChannels[1] := 8;
RightChannels[0] := 2;
RightChannels[1] := 4;
DefaultVoice.rate := N.defRate;
DefaultVoice.pitch := N.defPitch;
DefaultVoice.mode := N.defMode;
DefaultVoice.sex := N.defSex;
DefaultVoice.volume := N.defVol;
DefaultVoice.sampFreq := N.defFreq;
DefaultVoice.channels := 0;
CLOSE
CloseNarrator;
END Speech.